﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//继承模型：
//1.单继承：⼀个⼦类只有⼀个直接⽗类时称这个继承关系为单继承
//2.多继承：⼀个⼦类有两个或以上直接⽗类时称这个继承关系为多继承，多继承对象在内存中的模型
//是，先继承的⽗类在前⾯，后⾯继承的⽗类在后⾯，⼦类成员在放到最后⾯。
// 
//3.菱形继承：菱形继承是多继承的⼀种特殊情况。菱形继承的问题，从下⾯的对象成员模型构造，可以
//看出菱形继承有数据冗余和⼆义性的问题，在Assistant的对象中Person成员会有两份。⽀持多继承就
//⼀定会有菱形继承，像Java就直接不⽀持多继承，规避掉了这⾥的问题，所以实践中我们也是不建议
//设计出菱形继承这样的模型的。


class Person
{
public:
	int _age;
	string _name;
	string _sex;
};
class Student:virtual public Person
{
public:
	string _sid;
};
class Teacher :virtual public Person
{
public:
	string _tid;
};
class Assistant:public Student,public Teacher
{
public:
	int a;
};
void test() {

	//菱形继承
    //如果不指定作用域，会产生“二义性”，不知道_age
	//_name 是哪个的
	/*Assistant as;               
	as.Student::_age = 10;       
	as.Teacher::_age = 20;         
	as.Student::_name = "hlp";
	as.Teacher::_name = "lwx";  */

	//使用虚继承后，就不需要指定作用域
	Assistant as;
	as._age = 30;
	as._name = "lwx";
	as._sex = "男";

}
int main() {
	test();

	return 0;
}